/*
 * ProtocolData.h
 *
 *  Created on: Sep 7, 2017
 */

#ifndef _UART_PROTOCOL_DATA_H_
#define _UART_PROTOCOL_DATA_H_

#include <string>
#include "CommDef.h"
#define INQUIRY_CMD_A5    0x00
#define INQUIRY_CMD_E5_B1 0xB1
#define INQUIRY_CMD_E5_B2 0xB2
#define INQUIRY_CMD_E5_E1 0xE1
#define INQUIRY_CMD_E5_FA 0xFA
#define INQUIRY_CMD_A2 (0xA2)

typedef enum {
	E_MODE_NORMAL = 0,				//普通模式
	E_MODE_AUTO_FAN = 200,		//自动沸点模式
} E_MODE;

typedef enum {
	E_WATER_OUTPUT_MODE_COMMON = 0,		//常温档位
	E_WATER_OUTPUT_MODE_HOT,				//热水出水模式(自定义和所有热水档)
	E_WATER_OUTPUT_MODE_COLD			//冷水出水模式
} E_WATER_OUTPUT_MODE;

typedef struct {
	uint8_t mode;							//模式 0: 普通模式 200: 自动沸点模式

	uint8_t is_update_water_temp; 		//出水状态时是否更新当前设定出水温度
	uint8_t water_control;				//出水控制 0: 关闭 1: 开启

	uint8_t water_temp; 					//设定出水温度

	uint16_t water_output;				//出水量ml

	uint8_t heat_board_elec3_set;			//加热板上电磁阀3设置 0: 关闭 1: 开启
	uint8_t heat_board_elec3_switch;		//加热板上电磁阀3开关 0: 关闭 1: 开启
	uint8_t heat_board_elec2_set;			//加热板上电磁阀2设置 0: 关闭 1: 开启
	uint8_t heat_board_elec2_switch;		//加热板上电磁阀2开关 0: 关闭 1: 开启
	uint8_t heat_board_output12v_set;	//加热板上12V输出设置 0: 关闭 1: 开启
	uint8_t heat_board_output12v_switch;	//加热板上12V输出开关 0: 关闭 1: 开启
	uint8_t heat_board_elec1_set;			//加热板上电磁阀1设置 0: 关闭 1: 开启
	uint8_t heat_board_elec1_switch;		//加热板上电磁阀1开关 0: 关闭 1: 开启

	uint8_t temp_cor_set;				//温度矫正 0: 关闭 1: 开启
	uint8_t temp_cor_add_sub;			//温度校正加减 0: 减 1: 加
	uint8_t cmd;						//命令字
} ControlAA_00;

typedef struct {
	uint8_t set_put_power_limit; 		//设置投放功率限制	0: 不设置 1: 设置
	uint8_t set_water_output_min;		//设置每分钟出水量  0: 不设置 1: 设置
	uint8_t set_water_temp_max;			//设置最高出水温	0: 关 1: 开

	uint8_t water_temp_max;				//最高出水温度设定  95~98
	uint16_t water_output_speed;		//每分钟出水量230~750ml/min

	uint8_t high_water_level_set;		//高水位设置 0: 不设置 1: 设置
	uint8_t high_water_level_way;		//高水位闭合方式 0: 低电平闭合 1: 高电平闭合
	uint8_t low_water_level;			//低水位设置 0: 不设置 1: 设置
	uint8_t low_water_level_way;		//低水位闭合方式 0: 低电平闭合 1: 高电平闭合
	uint8_t water_level_switch_set;		//水位开关 0: 不设置 1: 设置
	uint8_t water_level_switch;			//水位开关 0: 关 1: 开

	uint8_t water_over_set;				//水箱溢出设置 0: 不设置 1: 设置
	uint8_t water_over_way;				//水箱溢出方式 0: 低电平 1: 高电平
	uint8_t water_tank_open_set;	    //水箱盖开关设置 0: 不设置 1: 设置
	uint8_t water_tank_open_way;		//水箱盖开关方式 0: 低电平闭合 1: 高电平闭合
	uint8_t water_tank_exist_set;		//水箱存在设置 0: 不设置 1: 设置
	uint8_t water_tank_exist_way;		//水箱存在方式 0: 低电平闭合 1: 高电平闭合
	uint8_t water_tank_low_level_set;	//水箱低水位设置 0: 不设置 1: 设置
	uint8_t water_tank_low_level_way;	//水箱低水位闭合方式 0: 低电平闭合 1: 高电平闭合

	uint16_t power;						//功率设置
	uint8_t cmd;						//命令字
} ControlAA_E1;

typedef struct {
	uint8_t clear_water_tank2_output_set; 		//净水箱2排水设置 0: 不设置 1: 设置
	uint8_t clear_water_tank2_output_switch;	//净水箱2排水开关 0: 关  1: 开
	uint8_t hot_tank_sterilization_set;			//热罐消毒设置 0: 不设置 1: 设置
	uint8_t hot_tank_sterilization_switch;		//热罐消毒开关 0: 关  1: 开
	uint8_t clear_water_tank1_output_set; 		//净水箱1排水设置 0: 不设置 1: 设置
	uint8_t clear_water_tank1_output_switch;	//净水箱1排水开关 0: 关  1: 开

	uint8_t led_set;							//LED设置 0: 不设置 1: 设置
	uint8_t led_switch;							//LED开关 0: 关  1: 开
	uint8_t rfid_reset_set;						//RFID复位设置 0: 不设置 1: 设置
	uint8_t rfid_reset_level;					//RFID复位引脚电平 0: 低电平  1: 高电平
	uint8_t dev_lock_tag_set;					//设备锁定标签设置 0: 不设置 1: 设置
	uint8_t dev_lock_tag_switch;				//设备锁定标签开关 0: 关闭锁定正常工作  1: 锁定不工作
	uint8_t water_tsd_clear_set;				//原水和净水TDS值清零设置 0: 不设置 1: 设置
	uint8_t water_tsd_clear_switch;				//原水和净水TDS值清零 0:无动作   1: 清除

	uint8_t uv_light_set;						//uv灯设置 0: 不设置 1: 设置
	uint8_t uv_light_switch;					//uv灯开关 0: 关  1: 开
	uint8_t booster_pump_set;					//增压泵设置 0: 不设置 1: 设置
	uint8_t booster_pump_switch;				//增压泵开关 0: 关  1: 开
	uint8_t brine_valve_set;					//浓水阀(冲洗阀)设置 0: 不设置 1: 设置
	uint8_t brine_valve_switch;					//浓水阀(冲洗阀)开关 0: 关  1: 开
	uint8_t reserve_valve_set;					//预留阀设置 0: 不设置 1: 设置
	uint8_t reserve_valve_switch;				//预留阀开关 0: 关  1: 开

	uint8_t hot_water_valve_set;				//热水阀设置 0: 不设置 1: 设置
	uint8_t hot_water_valve_switch;				//热水阀开关 0: 关  1: 开
	uint8_t input_water_valve_set;				//进水阀设置 0: 不设置 1: 设置
	uint8_t input_water_valve_switch;			//进水阀开关 0: 关  1: 开
	uint8_t tds2_set;							//TDS2设置 0: 不设置 1: 设置
	uint8_t tds2_switch;						//TDS2开关 0: 关  1: 开
	uint8_t tds1_set;							//TDS1设置 0: 不设置 1: 设置
	uint8_t tds1_switch;						//TDS1开关 0: 关  1: 开

	uint8_t cmd;								//命令字
} ControlAA_A3;

typedef struct {
	uint8_t mode;						//模式 0: 普通模式 21: 水泵启动开始出水 200: 自动沸点检测中
										//201: 自动沸点完成检测，出水温度为当前系统判定的沸点温度201: 自动沸点检测完成
	uint8_t output_water_control;			//出水控制 0: 关闭 1: 开启
	uint8_t output_water_temp;				//出水温度	0~100℃
	uint16_t output_water_output;			//出水量ml
	uint32_t output_water_output_total;	//累计出水量ml 按网络字节序表示 Byte5为最高位, Byte8为最低位

	uint8_t warn_over_temp;	//超温 （发热体上NTC感温达到或者超过106℃）报警（此时可以出冷水，待膜面温度低于进水温+30℃恢复正常工作）(H3)
	uint8_t warn_input_water_ntc_error; 	//厚膜进水NTC故障（温开水H7）
	uint8_t warn_descal;					//除垢
	uint8_t warn_zero_circuit_error;		//过零电路故障 0: 无故障 1: 有故障
	uint8_t warn_water_pump_open;			//水泵开路 0: 无故障 1: 有故障
	uint8_t warn_output_water_ntc_error; 	//出水口ntc故障 0: 无故障 1: 有故障

	uint8_t warn_output_water_temp_sensor_error;	//出水温度传感器故障
	uint8_t warn_water_shortage_failure_error;      //缺水
	uint8_t warn_water_pump_short;					//水泵短路 0: 无故障 1: 有故障
	uint8_t warn_heat_film_error;					//发热膜回路故障
	uint8_t warn_ice_detection;						//进水温度低于0-1℃判断结冰报警(E5)
	uint8_t warn_input_water_temp_sensor_error;		//进水温度传感器故障
	uint8_t warn_voltage_sensor_error;				//电压传感器故障
	uint8_t warn_over_high_temp;//超高温 （发热体上NTC感温达到或者超过110℃）报警（此时任何不允许任何出水操作指令）(H4)

	uint8_t warn_low_water_level;					//低水位 
	uint8_t warn_no_heat_tag;						//不加热标志
	uint8_t warn_high_water_level;					//高水位

	uint8_t elic1_switch;							//电磁阀1开关 0: 关 1: 开
	uint8_t heat_board_12v_or_uv_switch;			//加热板12V或UV开关 0: 关 1: 开
	uint8_t input_water_temp;						//进水温度

	uint8_t cmd;									//命令字
} Inquiry_A5;

typedef struct {
	uint16_t ntc_temp;								//发热体NTC实时温度值
	uint8_t soft_version;							//软件版本号
	uint8_t temp_correct_value; 				//温度校正值（调整范围为+3℃~-10℃，步进为0.5℃）

	uint16_t customer_code; 						//客户代号
	uint8_t cmd;									//命令字
} Inquiry_E5_B1;

typedef struct {
	uint16_t tds1_value;		//TDS1
	uint16_t tds2_value;		//TDS2

	uint8_t waste_water_high_level;	//废水箱高水位
	uint8_t waste_water_low_level;	//废水箱低水位
	uint8_t clear_water_high_level;	//净水箱高水位
	uint8_t clear_water_mid_level;	//净水箱中水位
	uint8_t clear_water_low_level;	//净水箱低水位
	uint8_t raw_water_high_level;	//原水箱高水位
	uint8_t raw_water_mid_level;	//原水箱中水位
	uint8_t raw_water_low_level;	//原水箱低水位

	uint8_t clear_water_tank2_output_tag;	//净水箱2排水标志 0: 排空结束 1: 正在排空
	uint8_t clear_water_tank1_output_tag;	//净水箱1排水标志 0: 排空结束 1: 正在排空
	uint8_t hot_tank_sterilization_state;	//热罐消毒状态 0: 消毒结束 1: 消毒中
	uint8_t raw_water_tank_exist_state;	//原水箱存在状态(P106JE_V06用作漏水） 1: 检测不到 0: 有水箱
	uint8_t uv_light_state;					//uv灯状态 0: 关 1: 开

	uint8_t rfid_reset_level;				//RFID复位引脚电平 0: 低电平输出  1: 高电平输出
	uint8_t clear_water_tank_over;			//净水箱溢出 0: 设备正常 1: 净水溢出
	uint8_t leak_state;						//漏水状态 0: 设备正常 1: 设备漏水

	uint16_t hot_tank_ntc_temp;				//热罐ntc温度	0.1℃

	uint8_t low_power_state;				//低功耗状态 0: 非低功耗 1: 设备低功耗
	uint8_t waste_water_tank_state;			//废水箱状态 0: 有废水箱 1: 检测不到

	uint8_t hot_water_valve_state;			//热水阀状态 0: 关 1: 开
	uint8_t input_water_valve_state;		//进水阀状态 0: 关 1: 开
	uint8_t tds2_state;						//TDS2状态 0: 关 1: 开
	uint8_t tds1_state;						//TDS1状态 0: 关 1: 开
	uint8_t create_water_pump_state;		//制水泵状态 0: 关 1: 开
	uint8_t brine_valve_state;				//浓水阀状态 0: 关 1: 开

	uint16_t booster_pump_ad_value;			//增压泵电流AD值

	uint8_t cmd;							//命令字
} Inquiry_E5_B2;

typedef struct {
	uint8_t output_water_temp_max;			//最高出水温度值
	uint16_t output_water_speed;			//每分钟出水流量

	uint8_t water_tank_over_level_judge;	//水箱溢水水位	0: 低电平为闭合 1：高电平为闭合
	uint8_t raw_water_tank_caver_judge; 	//原水箱盖闭合判断 0: 低电平为闭合 1：高电平为闭合
	uint8_t raw_water_tank_exist_judge;		//原水箱存在判断 0: 低电平为闭合 1: 高电平为闭合
	uint8_t raw_water_tank_low_level_judge;	//原水箱低水位判断 0: 低电平为低水位 1: 高电平为低水位
	uint8_t water_high_level_judge;			//高水位判断 0: 低电平为高水位 1: 高电平为高水位
	uint8_t water_low_level_judge;			//低水位判断 0: 低电平为低水位 1: 高电平为低水位
	uint8_t water_level_enable_tag;			//水位使能标志 0: 关闭水位判断 1: 开启水位判断

	uint16_t work_put_power_max;			//最高工作投放功率
	uint8_t cmd;							//命令字
} Inquiry_E5_E1;

typedef struct {
	uint16_t water_hot_heating_pump;         //热水抽水泵工作电流
	uint8_t cmd;
} Inquiry_E5_FA;

typedef struct {
	bool CmdSelfPrimingPump;                // 自吸泵
	bool CmdHeatingFilm;                    // 发热膜
	bool CmdPushRodMotorForward;            // 推杆电机正
	bool CmdDrainBoxPump;// 接水盒排水泵
	bool CmdIceMakingPump;// 制冰泵
	bool CmdExhaustFan;// 排气风扇(冷凝风扇)
	bool CmdReservedValve;// 预留阀
	bool CmdFridgeUVLight;// 冰箱UV灯

	bool CmdIceWaterInletValve;             // 制冰水进水阀
	bool CmdIntakeFan;                      // 进气风扇
	bool CmdColdWaterTankInletValve;        // 冷水箱进水阀
	bool CmdColdWaterTankCirculationPump;   // 冷水箱循环水泵
	bool CmdColdWaterDiaphragmPump;         // 冷水隔膜泵
	bool CmdSynchronousMotor;            		  	 // 同步电机
	bool CmdDeicingValve;                   			// 脱冰阀
	bool CmdColdWaterTankAntiFreeze;        	// 冷水箱防冻
	// 字节3 (bit5-0)
	bool CmdPushRodMotorReverse;            // 推杆电机负
	bool CmdIceFullIRTransmitter;         	  	 // 冰满红外发射
	bool CmdOpenWaterLevelProbe;            // 打开水位探针
	bool CmdOpenDeicingSensor;             	 // 打开脱冰感应
	bool CmdIceDispenserMotorForward;       // 出冰电机正转
	bool CmdIceDispenserMotorReverse;       // 出冰电机反转
} ControlAA_A1;

typedef struct {
	//字节一
	bool RespSelfPrimingPump;                // 自吸泵
	bool RespHeatingFilm;                    // 发热膜
	bool RespPushRodMotorForward;            // 推杆电机正
	bool RespDrainBoxPump;                   // 接水盒排水泵
	bool RespIceMakingPump;                  // 制冰泵
	bool RespExhaustFan;                     // 排气风扇
	bool RespReservedValve;                  // 预留阀
	bool RespFridgeUVLight;                  // 冰箱UV灯
	//字节二
	bool RespIceWaterInletValve;             // 制冰水进水阀
	bool RespIntakeFan;                      // 进气风扇
	bool RespColdWaterTankInletValve;        // 冷水箱进水阀
	bool RespColdWaterTankCirculationPump;   // 冷水箱循环水泵
	bool RespColdWaterDiaphragmPump;         // 冷水隔膜泵
	bool RespSynchronousMotor;               // 同步电机
	bool RespDeicingValve;                   // 脱冰阀
	bool RespColdWaterTankAntiFreeze;        // 冷水箱防冻
	//字节三 (bit5-0)
	bool RespPushRodMotorReverse;            // 推杆电机负
	bool RespIceFullIRTransmitter;           // 冰满红外发射
	bool RespOpenWaterLevelProbe;            // 打开水位探针
	bool RespOpenDeicingSensor;              // 打开脱冰感应
	bool RespIceDispenserMotorForward;       // 出冰电机正转
	bool RespIceDispenserMotorReverse;       // 出冰电机反转
	//字节四 (bit6-0)
	bool IceDispenserMicroSwitch;        // 出冰微动开关
	bool pre_IceMicroSwitch;					//上一次出冰微动开关

	bool DrainBoxWaterLevel;             // 接水盒水位
	bool DeicingMicroSwitch;             // 脱冰微动开关
	bool DetectionMicroSwitch;           // 检测微动开关
	bool IceMakingWaterLevel;            // 制冰水位
	bool ColdWaterTankLowLevel;          // 冷水箱低水位
	bool ColdWaterTankHighLevel;         // 冷水箱高水位
	//字节五
	uint8_t WaveRightData;               // 往右挥手数据（高四位）
	uint8_t WaveLeftData;                // 往左挥手数据（底四位）

	uint16_t DeicingSensorAD;         	// 脱冰感应AD值
	uint16_t WaterLevelProbeAD;       // 水位探针AD值
	uint16_t IceFullAD;               			// 冰满AD值
	uint16_t IceMakingPumpAD;        // 制冰泵AD值
	uint16_t DrainBoxPumpAD;          // 接水盒排水泵AD值
	uint16_t ColdWaterTankNTCTemp;    // 冷水箱NTC温度值
	uint16_t IceMakingWaterNTCTemp;   // 制冰水NTC温度值
} Inquiry_A2;

typedef struct {
	Inquiry_A5 inquiry_a5;
	Inquiry_E5_B1 inquiry_e5_b1;
	Inquiry_E5_B2 inquiry_e5_b2;
	Inquiry_E5_E1 inquiry_e5_e1;
	Inquiry_E5_FA inquiry_e5_fa;
	Inquiry_A2 inquiry_a2;			//制冰机回复
	uint8_t cmd;							//命令字

} SProtocolData;

typedef struct {
	ControlAA_00 control_aa_00;
	ControlAA_E1 control_aa_e1;
	ControlAA_A3 control_aa_a3;
	ControlAA_A1 control_aa_a1;		//制冰机控制
} SProtocolParam;

#endif /* _UART_PROTOCOL_DATA_H_ */
